package queue

import (
	"fmt"
	"time"

	uuid "github.com/satori/go.uuid"
)

//Message : 消息属性结构体
//消息内容绑定 Message struct
type Message struct {
	QueueName   string    `json:"queue_name"`   //所属队列
	Content     string    `json:"content"`      //消息内容
	DelaySecond int       `json:"delay_second"` // 延迟时间，单位秒
	CreateTime  time.Time `json:"-"`            //消息创建时间
	ID          string    `json:"-"`            //消息ID
}

//Enqueue : 消息入队
//param dm DelayMessage 延迟服务对象
//param queueName string 关联队列名
func (m *Message) Enqueue(dm *DelayMessage, qs *Queues) error {
	var qref = qs.GetQueueRef(m.QueueName) //获取指定队列的指针
	if qref == nil {
		return NewQueueError(queueInstanceNotFound) //可能是队列被删除
	}

	m.ID = uuid.NewV4().String() //动态生成uuid
	m.CreateTime = time.Now()

	//产生即使消息
	if m.DelaySecond == 0 {
		qref.Enqueue(m)
		return nil
	}

	if dm !=nil {
		dm.Add(m.DelaySecond, m.ID, func(args ...interface{}) {
			//Define action like this
			var m = args[0].(*Message)
			var qref = args[1].(IQueue)
			fmt.Println("延迟推送消息", m)
			qref.Enqueue(m)
		}, []interface{}{m, qref})
	}
	//调用延迟服务，当时间到了即刻触发调用事件

	return nil
}

//DeQueue : 消息出队
func (m *Message) DeQueue(qname string, qs *Queues) (*Message, error) {
	var qref = qs.GetQueueRef(qname)
	if qref == nil {
		return nil, NewQueueError(queueInstanceNotFound) //可能是队列被删除
	}

	var msg *Message
	var ok bool

	if msg, ok = qref.Dequeue().(*Message); !ok { //出队无数据
		return nil, nil
	}

	return msg, nil
}
